package algo3c3g3.model;

import org.jdom.Element;

import algo3c3g3.model.persistence.Persistable;

/**
 * Provee coordenadas 2D con valores x, y para representar la posicion de un
 * objeto.
 */
public class Coord implements Persistable
{
    private int x, y;

    /**
     * Crea un objeto Coord con los valores iniciales de coordenadas indicados.
     */
    public Coord(int x, int y)
    {
        setCoord(x, y);
    }
    
    /**
     * Crea un objeto Coord a partir de otro.
     */
    public Coord(Coord c)
    {
        x = c.x;
        y = c.y;
    }

    /**
     * Crea un objeto Coord con valor inicial 0 en ambas coordenadas.
     */
    public Coord()
    {
        this(0, 0);
    }

    public Coord(Element e)
    {
        this.load(e);
    }

	/**
     * Devuelve el valor de la coordenada x.
     */
    public int getXCoord()
    {
        return x;
    }

    /**
     * Devuelve el valor de la coordenada y.
     */
    public int getYCoord()
    {
        return y;
    }

    /**
     * Establece el valor de la coordenada x.
     */
    public void setXCoord(int x)
    {
        if (x < 0)
            throw new NegativeCoordenateException();
        
        this.x = x;
    }

    /**
     * Establece el valor de la coordenada y.
     */
    public void setYCoord(int y)
    {
        if (y < 0)
            throw new NegativeCoordenateException();
        
        this.y = y;
    }

    /**
     * Establece el valor de ambas coordenadas.
     */
    public void setCoord(int x, int y)
    {
        if ((x < 0) || (y < 0))
            throw new NegativeCoordenateException();
        
        this.x = x;
        this.y = y;
    }

    @Override
    public String toString()
    {
        return new String("x = " + x + ", y = " + y);
    }
    
    @Override
    public boolean equals(Object o)
    {
        Coord c = (Coord)o;
        return (c.x == x) && (c.y == y);
    }
    
    public void load(Element e)
    {
    	Element e1 = e.getChild("Coord");  
    	x = Integer.parseInt(e1.getChild("x").getText());
    	y = Integer.parseInt(e1.getChild("y").getText());
    }

    /**
     * es el encargado de serializar la coordenada.
     * @return el coord serializado dentro de un objeto Element
     */
    public Element save()
    {
        Element coord = new Element("Coord");
        coord.addContent(new Element("x").setText(Integer.toString(this.getXCoord())));
        coord.addContent(new Element("y").setText(Integer.toString(this.getYCoord())));
        return coord;
    }
    
    
    /**
     * Excepcion para indicar que se intento usar una coordenada negativa.
     */
    public static class NegativeCoordenateException extends RuntimeException {}
}
